levelbar: Avoid a use-after-free
authorMatthias Clasen <mclasen@redhat.com>
Fri, 26 Feb 2016 19:51:24 +0000 (14:51 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 26 Feb 2016 20:52:19 +0000 (15:52 -0500)
We were freeing the old offset before using its name to
recreate a new one. Don't do that.
Found by gcc's undefined behavior sanitizer.

gtk/gtklevelbar.c

index 46684cd6a8744f5e2616700a4591487638dc185d..99317dc390f692524b9321a842581a1dfecf34ae 100644 (file)
@@ -241,6 +241,7 @@ gtk_level_bar_ensure_offset (GtkLevelBar *self,
 {
   GList *existing;
   GtkLevelBarOffset *offset = NULL;
+  GtkLevelBarOffset *new_offset;
 
   existing = g_list_find_custom (self->priv->offsets, name, offset_find_func);
   if (existing)
@@ -249,14 +250,15 @@ gtk_level_bar_ensure_offset (GtkLevelBar *self,
   if (offset && (offset->value == value))
     return FALSE;
 
+  new_offset = gtk_level_bar_offset_new (name, value);
+
   if (offset)
     {
       gtk_level_bar_offset_free (offset);
       self->priv->offsets = g_list_delete_link (self->priv->offsets, existing);
     }
 
-  offset = gtk_level_bar_offset_new (name, value);
-  self->priv->offsets = g_list_insert_sorted (self->priv->offsets, offset, offset_sort_func);
+  self->priv->offsets = g_list_insert_sorted (self->priv->offsets, new_offset, offset_sort_func);
 
   return TRUE;
 }